using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Collections;

public class TagyLogic : MonoBehaviour
{   
    [SerializeField] private int[] InitialOrder;
    [SerializeField] private int[] CurretOrder;
    [SerializeField] private GameObject CellPrefab;
    [SerializeField] private GameObject LastCell;
    [SerializeField] private Sprite[] SpiteMass = new Sprite[16];
    [SerializeField] GameObject Lotok;
    [SerializeField] TagyOn tagyOnObject;
    private GameObject CanvasObj;
    [SerializeField] private float DistanseCell;
    private bool Decide;
    public int Win;


    //скип
   // bool canSkip = false;
    [SerializeField] private GameObject ButtonSkip;

    private void OnEnable()    
    {
        CanvasObj = Lotok.transform.parent.gameObject;

        Lotok.transform.SetParent(PlayerData.ParentObject.gameObject.transform);
        
        while (Decide == false)
        {
            for (int i = CurretOrder.Length - 1; i >= 1; i--)
            {
                int j =  Random.Range(0, i+1);
                //rand.Next(i + 1);
        
                int tmp =  CurretOrder[j];
                CurretOrder[j] =  CurretOrder[i];
                CurretOrder[i] = tmp;
            }


            int NolikRow = 0, nr = 0;

            for (int i = 0; i < CurretOrder.Length; i++)
            {
                if (CurretOrder[i] == 0)
                {
                    nr = i;
                }
            }

            if(nr <= 3)
                NolikRow = 1;
            if(nr > 3 && nr <= 7)
                NolikRow = 2;
            if(nr > 7 && nr <= 11)
                NolikRow = 3;
            if(nr > 11 && nr <= 15)
                NolikRow = 4;

            int Summ = 0;

            for (int i = 0; i < 15; i++)
            {
                int ValueOne = CurretOrder[i];
                if (ValueOne != 0)
                {
                    for (int j = i+1; j <= 15; j++)
                    {
                       int ValueTwo =  CurretOrder[j];
                       if (ValueOne > ValueTwo && ValueTwo != 0)
                       {
                            Summ++;
                       }
                    }
                }


            }

            Summ += NolikRow;
            if (Summ % 2 == 0)
            {
                Decide = true;
                Debug.Log("Генерация успешна");
            }
            Debug.Log("Провал генерации. Следующая попытка");
        }
        
        for (int i = 0; i < CurretOrder.Length; i++)
        {
            GameObject CurrentCell = Instantiate(CellPrefab, gameObject.transform.position, Quaternion.identity); // Получаем только что созданную клетку
            CurrentCell.name = CurrentCell.name +  CurretOrder[i];// Чисто чтобы в инспекторе имена отличать
            CurrentCell.transform.SetParent(gameObject.transform); //делаю созданную клетку дочерней для GridTagy
            CurrentCell.GetComponent<RectTransform>().localScale = new Vector3(1,1,1); // меняю их скейл, потому что он какого то хера огромный
            CurrentCell.GetComponent<TagyIdCell>().id = CurretOrder[i]; // Ну и Idшник присваиваю 
            
            CurrentCell.GetComponent<Image>().sprite = SpiteMass[CurrentCell.GetComponent<TagyIdCell>().id];


            //GameObject CurrentTextCell = CurrentCell.transform.GetChild(0).gameObject; // Поулчаю текст клетки
           // CurrentTextCell.GetComponent<TextMeshProUGUI>().text = CurretOrder[i].ToString(); //Хуярю текст

            if (CurrentCell.GetComponent<TagyIdCell>().id == 0) //Работы с пустой клеткой
            {
               // Destroy(CurrentCell.transform.GetChild(0).gameObject);
                CurrentCell.GetComponent<Image>().color = new Color(0,0,0,0);
                LastCell = CurrentCell;
            }
            

             
        }

        StartCoroutine(startSkip());

    }

    private void OnDisable() {
        for (int i = 0; i < CurretOrder.Length; i++)
        {
            GameObject currentCell_;
            currentCell_ = gameObject.transform.GetChild(i).transform.gameObject;
            Destroy(currentCell_);
            
        }
        CurretOrder = null;
        CurretOrder = new int[16];
        for (int i = 0; i < InitialOrder.Length; i++)
        {
            CurretOrder[i] = InitialOrder[i];
        }
        Decide = false;
    }
     public void MoveCell(GameObject ClickCell) //МУУУУУУУУУУУУУУУУУУУУУУУУУУУУУУВ
     {
        if (Vector3.Distance(ClickCell.transform.position, LastCell.transform.position) < DistanseCell)
        {
            //Vector3 Buff = new Vector3(); 
            //Buff = ClickCell.transform.position;
            //ClickCell.transform.position = LastCell.transform.position;
            //LastCell.transform.position = Buff;
            Debug.Log("Дистанция между текущей клеткой и пустой клеткой: " + Vector3.Distance(ClickCell.transform.position, LastCell.transform.position));
            int a = LastCell.transform.GetSiblingIndex();
            LastCell.transform.SetSiblingIndex(ClickCell.transform.GetSiblingIndex());
            ClickCell.transform.SetSiblingIndex(a);

            CheckWin();
        }
     }

    private void CheckWin()
    {
        for (int i = 0; i < InitialOrder.Length; i++)
        {
            if (gameObject.transform.GetChild(i).gameObject.GetComponent<TagyIdCell>().id == InitialOrder[i])
            {
                if (i == 15)
                {
                    Debug.Log("Win");
                    Win = 1;
                    PlayerPrefs.SetInt("Win", Win);
                }
            }
            else
            {
                break;
            }
        }
    }
    public void CloseTagy()
    {
        //Lotok.transform.SetParent(null);
        //выкинуть рыбу, если есть задание FindFish и был 0 стал 1
        bool hasTask = PlayerData.FindTaskByName(NameLib.FindFish);
        if (hasTask && Win == 1)
        {
            tagyOnObject.SpawnObject();
            Win = 0;
        }
            //спавн рыбы
        Lotok.transform.SetParent(CanvasObj.transform);
        StopCoroutine(startSkip());
    }

    private IEnumerator startSkip() 
    {
        Debug.Log("Начало отсчёта");
        yield return new WaitForSeconds(60);
        Debug.Log("Конец отсчёта");
        //canSkip = true;
        ButtonSkip.SetActive(true);
    }

    public void Skip()
    {
        Win = 1;
        CloseTagy();
        Lotok.SetActive(false);
        ButtonSkip.SetActive(false);
    }

}
